/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package webservices;


import ejb.UtilizadorBean;
import entidades.Administrador;
import entidades.Encomenda;
import entidades.LinhaEncomenda;
import entidades.ProdutoCatalogo;
import excecoes.EntidadeExistenteWSException;
import excecoes.EntidadeNaoExistenteException;
import excecoes.FaultDetail;
import excecoes.WSException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.xml.ws.WebServiceContext;

@WebService(serviceName = "AdministradorWS")
@Stateless()
//@RolesAllowed("Administrador")
public class AdministradorWS {

    @Resource
    private WebServiceContext wsContext;
    @PersistenceContext
    private EntityManager em;
    @EJB
    UtilizadorBean uBean;
    static final Logger logger = Logger.getLogger(AdministradorWS.class.getName());

    @WebMethod(operationName = "criarAdministrador")
    public String criarAdministrador(
            @WebParam(name = "username") String username,
            @WebParam(name = "password") String password,
            @WebParam(name = "morada") String morada,
            @WebParam(name = "tipo") String tipo,
            @WebParam(name = "nome") String nome,
            @WebParam(name = "email") String email) throws EntidadeExistenteWSException, WSException {

        if (uBean.existeUsername(username)) {
            throw new EntidadeExistenteWSException(new FaultDetail("Utilizador já existente!"));
        }

        try {
            em.persist(new Administrador(username, nome, email, morada, password, nome, null));
        } catch (Exception e) {
            logger.log(Level.SEVERE, "Erro no metodo criarAdministrador()", e);
            throw new WSException("Erro", new FaultDetail("Erro do servidor"));
        }
        return "OK";
    }

    @WebMethod(operationName = "listarEncomendas")
    @SuppressWarnings("null")
    public List<ProdutoCatalogo> listaDeProdutosEncomendas(int codEncomenda) throws WSException {

        try {
            List<Encomenda> encomendas = em.createNamedQuery("findAllEncomendas", Encomenda.class).getResultList();

            List<ProdutoCatalogo> listaProdutoCatalogo = null;

            Encomenda encomenda = em.find(Encomenda.class, codEncomenda);

            if (encomenda == null) {

                throw new EntidadeNaoExistenteException();
            }

            for (LinhaEncomenda linhaEncomenda : encomenda.getListaLinhasEncomenda()) {

                ProdutoCatalogo produtoCatalogo = em.find(ProdutoCatalogo.class, linhaEncomenda.getProdutoCatalogo().getId());

                listaProdutoCatalogo.add(produtoCatalogo);

                produtoCatalogo.setStock(null);
            }

            return listaProdutoCatalogo;
        } catch (Exception e) {
            logger.log(Level.SEVERE, "Erro", e);
            throw new WSException("Erro", new FaultDetail("Erro do servidor"));
        }

    }

}
